package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"gitee.com/yuwenlwl/comsdk"
)

func main() {
	// 初始化应用
	app, err := comsdk.InitApp("http://api-gateway.example.com", "/api/components")
	if err != nil {
		log.Fatalf("初始化应用失败: %v", err)
	}

	// 注册API路由
	app.Server.Router.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		comsdk.JSONResponse(w, http.StatusOK, map[string]interface{}{
			"message": "Hello from " + app.Config.AppID,
			"time":    time.Now().Format(time.RFC3339),
		})
	}).Methods("GET")

	// 启动信号处理
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 监听系统信号
	go handleSignals(cancel)

	// 打印启动信息
	fmt.Printf("[%s] 启动服务器在 :%s 端口...\n", app.Config.AppID, app.Config.Port)
	fmt.Printf("配置信息:\n")
	fmt.Printf("- 组件ID: %s\n", app.Config.AppID)
	fmt.Printf("- 组件名称: %s\n", app.Config.Name)
	fmt.Printf("- 版本: %s\n", app.Config.Version)
	fmt.Printf("- 健康检查URL: http://localhost:%s/health\n", app.Config.Port)

	// 启动应用（阻塞调用）
	if err := app.StartApp(ctx); err != nil && err != http.ErrServerClosed {
		log.Fatalf("服务器错误: %v", err)
	}
}

// 处理系统信号
func handleSignals(cancel context.CancelFunc) {
	signalChan := make(chan os.Signal, 1)
	signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
	<-signalChan

	log.Println("收到关闭信号，正在优雅关闭...")
	cancel() // 取消上下文，通知所有组件关闭

	// 给清理过程一些时间
	time.Sleep(2 * time.Second)
	log.Println("服务已关闭")
	os.Exit(0)
}
